home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 11, No. 04 - 05 - 06 (1990)(MindCraft Publishing)[no boot].zip / Nibble Volume 11, No. 04 - 05 - 06 (1990)(MindCraft Publishing)[no boot].po / NIBBLE.1990:MAY.VOL11.NO05 / FORMATTER.BIN.S < prev    next >
Text File  |  1996-12-24  |  6KB  |  145 lines

  1. ********************************
  2. * FORMATTER.BIN SOURCE CODE    *
  3. * BY MIKE PRIDMORE             *
  4. * COPYRIGHT(C) 1990            *
  5. * MINDCRAFT PUBL. CORP.        *
  6. * CONCORD, MA  01742           *
  7. ********************************
  8. *
  9. * EDITOR ASSEMBLER -=> MERLIN-8
  10. *
  11. HTAB      EQU $24        ; CURSOR HORIZONTAL LOCATION
  12. CHRGET    EQU $B1        ; GET NEXT CHARACTER ROUTINE
  13. HIMEM     EQU $73        ; POINTER TO HIGHEST RAM MEMORY
  14. STRTOP    EQU $6F        ; POINTER TO TOP OF STRING POOL
  15. STRADD    EQU $5E        ; HOLDS REQUESTED STRING LOCATION
  16. *
  17. * CONSTANTS & AMPERSAND VECTOR
  18. *
  19. SPACE     EQU $20        ; HEX FOR 'SPACE' CHARACTER
  20. TOKEN     EQU $BA        ; HEX FOR PRINT TOKEN
  21. WIDTH     EQU $28        ; SET TO MAX WIDTH OF YOUR SCREEN
  22. CR        EQU $8D        ; HEX FOR CARRIAGE RETURN
  23. MINUS     EQU $80        ; HEX FOR 128 DECIMAL
  24. AMPVEC    EQU $3F5       ; LOCATION OF AMPERSAND VECTOR
  25. *
  26. * APPLESOFT ROUTINES
  27. *
  28. FRESTR    EQU $E5FD      ; PUTS STRING LOCATION IN STRADD
  29. EVAL      EQU $DD7B      ; EVALUATE EXPRESSION ROUTINE
  30. SYNERR    EQU $DEC9      ; PRINT SYNTAX ERROR
  31. PRINT     EQU $FDF0      ; PRINT CHARACTER TO SCREEN
  32. *
  33.           ORG $94ED
  34. *
  35.           LDA #<INIT     ; SET HIMEM, MAX STRING ADDRESS
  36.           STA HIMEM      ; AND AMPERSAND VECTOR TO $9500,
  37.           STA STRTOP     ; THE ADDRESS OF THE MAIN ROUTINE
  38.           STA AMPVEC+1
  39.           LDA #>INIT
  40.           STA HIMEM+1    ; BUT NOT THE ROUTINE ITSELF.
  41.           STA STRTOP+1
  42.           STA AMPVEC+2
  43.           RTS            ; RETURN TO BASIC PROGRAM
  44. *
  45. * INIT ROUTINE
  46. *
  47. INIT      CMP #TOKEN     ; IS CHAR A PRINT TOKEN ($BA)?
  48.           BEQ FINDSTR    ; YES, CONTINUE AT FINDSTR
  49.           JMP SYNERR     ; NO, PRINT SYNTAX ERROR
  50. *
  51. * FIND STRING ROUTINE
  52. *
  53. FINDSTR   JSR CHRGET     ; GET NEXT CHAR AFTER PRINT TOKEN
  54.           JSR EVAL       ; A/S STRING? NO, PRINT ERR MSG
  55.           JSR FRESTR     ; PUT ADDRESS IN $5E, A=LEN OF STR
  56.           STA LEN        ; STORE STRING LENGTH
  57.           DEC LEN        ; SUBTRACT ONE FROM IT
  58.           LDA #$00       ; SET ALL POINTERS TO ZERO
  59.           STA BEGIN      ; AND SET HTAB = 1 (ZERO IN HEX)
  60.           STA END
  61.           STA FLAG
  62.           STA HTAB
  63. *
  64. * ADD ROUTINE
  65. *
  66. ADD       CLC            ; CLEAR THE CARRY FLAG
  67.           LDA BEGIN      ; GET SUBSTRINGS STARTING POINTER
  68.           ADC #WIDTH     ; ADD TO WIDTH TO FIND END PTR
  69.           CMP LEN        ; COMPARE RESULTS AGAINST LEN
  70.           BEQ ADD2       ; IF EQUAL BRANCH TO ADD2
  71.           BGE LASTLINE   ; IF >, THIS IS LAST LINE
  72. ADD2      STA END        ; STORE RESULTS IN END
  73.           LDY BEGIN      ; SET Y TO EQUAL BEGIN POINTER
  74. LOOP      LDA (STRADD),Y ; GET A CHARACTER
  75.           CMP #$20       ; IS IT A SPACE?
  76.           BEQ SEARCH     ; YES, THEN A SPACE IS PRESENT
  77.           CPY END        ; IS Y=END? (CHECK WHOLE SUBSTRING?)
  78.           BEQ NONE       ; YES, THEN NO SPACE WAS FOUND.
  79.           INY            ; NO, THEN Y=Y+1
  80.           BNE LOOP       ; LET'S DO IT AGAIN
  81. *
  82. * SEARCH FOR SPACE ROUTINE
  83. *
  84. SEARCH    LDY END        ; SET Y = TO END PTR
  85. LOOP1     LDA (STRADD),Y ; GET A CHAR
  86.           CMP #SPACE     ; IS IT A SPACE?
  87.           BEQ WHERE      ; YES, FIND OUT WHERE IN STRING
  88.           DEY            ; NO THEN Y=Y-1
  89.           BNE LOOP1      ; TRY AGAIN
  90. WHERE     CPY END        ; IS Y = END (40 CHAR BEIGN PRINTED?)
  91.           BLT LESS       ; NO, < 40 CHAR TO BE PRINTED
  92.           INC FLAG       ; FLAG=1 (40 CHAR TO BE PRINTED)
  93.           DEC END        ; SET END= LAST LETTER OF SUBSTRING
  94.           JMP PRINTIT    ; PRINT OUT STRING
  95. LESS      DEY            ; Y=Y-1
  96.           STY END        ; STRORE Y RESULTS IN END
  97.           JMP PRINTIT    ; PRINT OUT SUBSTRING
  98. NONE      DEC END        ; END = END -1
  99.           LDA #$03       ; FLAG = 3, NO SPACE FOUND
  100.           STA FLAG
  101.           JMP PRINTIT    ; PRINT OUT SUBSTRING
  102. LASTLINE  LDA #$02       ; FLAG=2, LAST LINE TO PRINT
  103.           STA FLAG
  104.           LDA LEN        ; SET A = LEN
  105.           STA END        ; STORE IT IN END
  106. *
  107. * PRINT OUT SUBSTRING OF STRING
  108. *
  109. PRINTIT   LDY BEGIN      ; SET Y = TO BEGINNING LETTER
  110. LOOP2     LDA (STRADD),Y ; GET THE LETTER FROM THE STRING
  111.           ORA #MINUS     ; STRIP OFF THE HI BIT
  112.           JSR PRINT      ; PRINT IT
  113.           CPY END        ; ARE WE DONE WITH THIS LINE?
  114.           BEQ CHKFLAG    ; YES, CHECK TO SEE OF FLAG > 0
  115.           INY            ; NO THEN Y=Y+1
  116.           BNE LOOP2      ; DO IT AGAIN
  117. CHKFLAG   LDA FLAG       ; A=FLAG
  118.           CMP #$01       ; FLAG=1?
  119.           BEQ FORTY      ; YES, EXACTLY 40 CHAR PRINTED
  120.           CMP #$02       ; FLAG=2?
  121.           BEQ EXIT       ; YES, EXIT ROUTINE
  122.           CMP #$03       ; FLAG=3?
  123.           BEQ NOSPACE    ; YES, NO SPACES WERE FOUND
  124.           LDA #CR        ; IF FLAG=0, SET A=CARRIAGE RETURN
  125.           JSR PRINT      ; PRINT IT
  126.           INC END        ; SET END TO POINT TO NEXT LETTER
  127.           INC END        ; AND STORE IT IN BEGIN POINTER
  128.           LDY END
  129.           STY BEGIN
  130.           JMP ADD        ; GET NEXT SUBSTRING
  131. FORTY     INC END        ; END = END + 1
  132. NOSPACE   INC END        ; END = END + 1
  133.           LDY END        ; SET BEGIN TO EQUAL END
  134.           STY BEGIN
  135.           LDA #$00       ; SET FLAG TO ZERO
  136.           STA FLAG
  137.           JMP ADD        ; GET NEXT SUBSTRING
  138. EXIT      LDA #CR        ; SET A = CARRIAGE RETURN
  139.           JSR PRINT      ; PRINT IT
  140.           RTS            ; RETURN TO BASIC PROGRAM
  141. LEN       DS 1           ; HOLDS LEN OF STRING TO PRINT
  142. BEGIN     DS 1           ; HOLDS 1ST CHAR IN SUBSTRING
  143. END       DS 1           ; HOLDS LAST CHAR IN SUBSTRING
  144. FLAG      DS 1           ; USE TO INDICATE CONDITIONS
  145.